package br.com.requisicao.compra.Bean;

import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import br.com.requisicao.compra.canonico.Filtro;
import br.com.requisicao.compra.canonico.PedidoCompra;
import br.com.requisicao.compra.canonico.PedidoCompraProduto;
import br.com.requisicao.compra.canonico.Usuario;
import br.com.requisicao.compra.constantes.ConstantesMensagens;
import br.com.requisicao.compra.formatador.FormataStatus;
import br.com.requisicao.compra.service.IPedidoCompraService;
import br.com.requisicao.compra.service.IUsuarioService;
import br.com.requisicao.compra.service.impl.PedidoCompraService;
import br.com.requisicao.compra.service.impl.UsuarioService;
import br.com.requisicao.compra.util.ExportarPdf;
import br.com.requisicao.compra.util.Verificadores;

import comum.select.item.SelectItemComboBox;
import comum.templates.TemplatesPdf;

@ManagedBean(name = "pedidoCompraBean")
@SessionScoped
public class PedidoCompraBean {

	private List<PedidoCompra> listaPedidoCompra = null;
	private PedidoCompra pedidoCompra = null;
	private Filtro filtro = null;
	private List<SelectItem> statusPermissao;

	private IPedidoCompraService pedidoCompraService;
	private IUsuarioService usuarioService;

	public PedidoCompraBean() {
		this.listaPedidoCompra = new ArrayList<PedidoCompra>();
	}

	/**
	 * Metodo responsavel por executar a consulta de pedidos de compra
	 */
	public void consultar() {
		FacesContext context = FacesContext.getCurrentInstance();
		ResourceBundle bundle = ResourceBundle.getBundle(ConstantesMensagens.BUNDLE, context.getViewRoot().getLocale());
		FacesMessage msg = null;
		String mensagem = null;
		try {
			atualizaListaPedidoCompraRetorno();
			// carrega o combobox de status para filtragem de dados
			this.statusPermissao = SelectItemComboBox.geraStatusFiltro();
		} catch (Exception e) {
			mensagem = bundle.getString(ConstantesMensagens.ERRO_CONSULTAR_PEDIDO_COMPRA);
			if (mensagem != null) {
				msg = new FacesMessage(mensagem);
				msg.setSeverity(FacesMessage.SEVERITY_FATAL);
				context.addMessage(null, msg);
			}
		}
	}

	/**
	 * Metodo criado para atualizar a tabela de pedidos de compra
	 */
	public void atualizaListaPedidoCompraRetorno() {
		pedidoCompraService = new PedidoCompraService();
		String perfilUsuario = Verificadores.verificaPerfilUsuario();
		if (this.filtro == null) {
			this.filtro = new Filtro();
		}

		this.listaPedidoCompra = pedidoCompraService.obtemPedidoCompra(perfilUsuario, filtro);

		// formata o status para visualizacao do usuario
		for (PedidoCompra pc : this.listaPedidoCompra) {
			pc.setStatusPedido(FormataStatus.formataStatus(pc.getStatusPedido()));
			for (PedidoCompraProduto pcp : pc.getPedidoCompraProduto()) {
				pcp.setStatusItem(FormataStatus.formataStatus(pcp.getStatusItem()));
			}
		}
	}

	public void gerarPdfpedidoCompra() {

		usuarioService = new UsuarioService();

		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) context
				.getExternalContext().getRequest();
		Principal usuarioLogado = request.getUserPrincipal();

		String tituloPdf = "PedidoCompra".concat("-").concat(String.valueOf(this.pedidoCompra.getCodigo()));
		String templatePdfPedidoCotacao = null;

		try {

			Usuario usuario = usuarioService.obtemUsuarioPorLogin(usuarioLogado.getName());

			templatePdfPedidoCotacao = TemplatesPdf
					.templatePdfPedidoCompra(this.pedidoCompra, usuario);

			// anexo do e-mail
			ExportarPdf.gerarPdf(templatePdfPedidoCotacao, tituloPdf);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @return the listaPedidoCompra
	 */
	public List<PedidoCompra> getListaPedidoCompra() {
		return listaPedidoCompra;
	}

	/**
	 * @param listaPedidoCompra
	 *            the listaPedidoCompra to set
	 */
	public void setListaPedidoCompra(List<PedidoCompra> listaPedidoCompra) {
		this.listaPedidoCompra = listaPedidoCompra;
	}

	/**
	 * @return the pedidoCompraService
	 */
	public IPedidoCompraService getPedidoCompraService() {
		return pedidoCompraService;
	}

	/**
	 * @param pedidoCompraService
	 *            the pedidoCompraService to set
	 */
	public void setPedidoCompraService(IPedidoCompraService pedidoCompraService) {
		this.pedidoCompraService = pedidoCompraService;
	}

	/**
	 * @return the usuarioService
	 */
	public IUsuarioService getUsuarioService() {
		return usuarioService;
	}

	/**
	 * @param usuarioService
	 *            the usuarioService to set
	 */
	public void setUsuarioService(IUsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	/**
	 * @return the pedidoCompra
	 */
	public PedidoCompra getPedidoCompra() {
		return pedidoCompra;
	}

	/**
	 * @param pedidoCompra
	 *            the pedidoCompra to set
	 */
	public void setPedidoCompra(PedidoCompra pedidoCompra) {
		this.pedidoCompra = pedidoCompra;
	}

	/**
	 * @return the filtro
	 */
	public Filtro getFiltro() {
		return filtro;
	}

	/**
	 * @param filtro
	 *            the filtro to set
	 */
	public void setFiltro(Filtro filtro) {
		this.filtro = filtro;
	}

	/**
	 * @return the statusPermissao
	 */
	public List<SelectItem> getStatusPermissao() {
		return statusPermissao;
	}

	/**
	 * @param statusPermissao
	 *            the statusPermissao to set
	 */
	public void setStatusPermissao(List<SelectItem> statusPermissao) {
		this.statusPermissao = statusPermissao;
	}

}